﻿#include<stdio.h>

//
//struct _iobuf {
//	char* _ptr;
//	int   _cnt;
//	char* _base;
//	int   _flag;
//	int   _file;
//	int   _charbuf;
//	int   _bufsiz;
//	char* _tmpfname;
//};
//typedef struct _iobuf FILE;
//



//文件的打开和关闭
//
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("D:\\桌面\\hello.txt", "w");
//
//	//"data.txt"     为相对路径，在当前文件下
//	//"..\\data.txt"      为相对路径，创建在上级文件下的文件
//	//"D:\\桌面\\hello.txt"   为绝对路径 ，  可随意创建在任意位置    ，注意转义字符
//
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//	//读写文件
//	
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}
//
//



//顺序读写函数测试


//fgetc    -----    字符输入函数

//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//	//以字符的形式写文件
//	int ret = fgetc(pf);
//	printf("%c\n", ret);
//	ret = fgetc(pf);
//	printf("%c\n", ret); 
//	ret = fgetc(pf);
//	printf("%c\n", ret);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//fputc    -----    字符输出函数
//
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//	//以字符的形式写文件
//	fputc('d', pf);
//	fputc('e', pf);
//	fputc('f', pf);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//fgets    -----    文本行输入函数

//
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//	//以字符的形式读文件
//	char str[20] = { 0 };
//	fgets(str, 10, pf);
//	printf("%s\n", str);
//	fgets(str, 10, pf);
//	printf("%s\n", str);
//	fgets(str, 10, pf);
//	printf("%s\n", str);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//fputs    -----    文本行输出函数
//
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return;
//	}
//	//以字符串的形式写文件
//	fputs("hello world!\n", pf);
//	fputs("Hi world!\n", pf);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//fscanf   -----    格式化输入函数
//
//struct Stu
//{
//	char name[20];
//	int age;
//	char sex[6];
//};
//
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data_fprintf.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//	}
//	//读写文件
//	//struct Stu S1 = { "张三",20,"男" };
//	struct Stu S2 = { 0 };
//	fscanf(pf, "%s %d %s\n", S2.name, &(S2.age), S2.sex);
//	printf("%s %d %s\n", S2.name, S2.age, S2.sex);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//fprintf  -----    格式化输出函数

//struct Stu
//{
//	char name[20];
//	int age;
//	char sex[6];
//};
//
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data_fprintf.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//	}
//	//读写文件
//	struct Stu S1 = { "张三",20,"男" };
//	fprintf(pf, "%s %d %s\n", S1.name, S1.age, S1.sex);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//fread    -----    二进制输入

//struct Stu
//{
//	char name[20];
//	int age;
//	char sex[6];
//};
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data_fwrite.txt", "rb");
//	if (pf == NULL)
//	{
//		ferror("fopen");
//		return;
//	}
//	//读写文件
//	struct Stu S = { 0 };
//	fread(&S, sizeof(struct Stu), 1, pf);
//	printf("%s %d %s\n", S.name, S.age, S.sex);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//fwrite   -----    二进制输出

//struct Stu
//{
//	char name[20];
//	int age;
//	char sex[6];
//};
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data_fwrite.txt", "wb");
//	if (pf == NULL)
//	{
//		ferror("fopen");
//		return;
//	}
//	//读写文件
//	struct Stu S = { "赵六",23,"女" };
//	fwrite(&S, sizeof(struct Stu), 1, pf);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//scanf---- - 从标准输入流读取格式化的数据

//printf---- - 向标准输出流写格式化的数据

//fscanf---- - 适用于所有输入流的格式化输入函数

//fprintf---- - 适用于所有输出流的格式化输出函数

//sscanf---- - 从字符串中读取格式化的数据

//struct Stu
//{
//	char name[20];
//	int age;
//	char sex[6];
//};
//int main()
//{
//	char arr[40] = { 0 };
//	struct Stu S = { "王五",18,"保密" };
//	struct Stu S2 = { 0 };
//	sprintf(arr, "%s %d %s\n", S.name, S.age, S.sex);
//	sscanf(arr, "%s %d %s", S2.name, &(S2.age), S2.sex);
//	printf("%s %d %s\n", S2.name, S2.age, S2.sex);
//	return 0;
//}
//
//

//sprintf---- - 将格式化的数据，转换成字符串

//struct Stu
//{
//	char name[20];
//	int age;
//	char sex[6];
//};
//int main()
//{
//	char arr[40] = { 0 };
//	struct Stu S = { "王五",18,"保密" };
//	sprintf(arr, "%s %d %s\n", S.name, S.age, S.sex);
//	printf("%s\n", arr);
//	return 0;
//}
//




//fseek

//int main()
//{
//	FILE* pf = fopen("text_fseek.txt", "r");
//	if (pf == NULL)
//	{
//		ferror("fopen");
//		return 1;
//	}
//	//使文件指针指向f
//	fseek(pf, 5, SEEK_SET);
//	char ch = fgetc(pf);
//	printf("%c\n", ch);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//
//


//int main()
//{
//	FILE* pf = fopen("text_fseek.txt", "r");
//	if (pf == NULL)
//	{
//		ferror("fopen");
//		return 1;
//	}
//	//使文件指针指向f
//	char ch = fgetc(pf);
//	printf("%c\n", ch);//a
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);//b
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);//c
//
//	fseek(pf, 2, SEEK_CUR);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//int main()
//{
//	FILE* pf = fopen("text_fseek.txt", "r");
//	if (pf == NULL)
//	{
//		ferror("fopen");
//		return 1;
//	}
//	//使文件指针指向f
//	char ch = fgetc(pf);
//	printf("%c\n", ch);//a
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);//b
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);//c
//
//	fseek(pf, -21, SEEK_END);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//ftell

//int main()
//{
//	FILE* pf = fopen("text_fseek.txt", "r");
//	if (pf == NULL)
//	{
//		ferror("fopen");
//		return 1;
//	}
//  //返回当前位置举例起始地址的偏移量
//	char ch = fgetc(pf);
//	printf("%c\n", ch);//a
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);//b
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);//c
//
//	int pos = ftell(pf);
//	printf("%d\n", pos);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//rewind

//int main()
//{
//	FILE* pf = fopen("text_fseek.txt", "r");
//	if (pf == NULL)
//	{
//		ferror("fopen");
//		return 1;
//	}
//	//使文件指针指向起始位置
//	char ch = fgetc(pf);
//	printf("%c\n", ch);//a
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);//b
//
//	ch = fgetc(pf);
//	printf("%c\n", ch);//c
//	printf("rewind之前pf相对起始位置的偏移量：");
//	int pos = ftell(pf);
//	printf("%d\n", pos);
//	rewind(pf);
//	printf("rewind之后pf相对起始位置的偏移量：");
//	pos = ftell(pf);
//	printf("%d\n", pos);
//	ch = fgetc(pf);
//	printf("%c\n", ch);//a
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//
//

//
//int main()
//{
//	int a = 10000;
//	FILE* pf = fopen("test.txt", "wb");
//	fwrite(&a, 4, 1, pf);//二进制的形式写到文件中
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//

//
//int main()
//{
//	int c; 
//	// 注意：int，非char，要求处理EOF
//	FILE* fp = fopen("test1.txt", "r");
//	if (!fp) {
//		perror("fopen");
//	}
//	//fgetc 当读取失败的时候或者遇到文件结束的时候，都会返回EOF
//	while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
//	{
//		putchar(c);
//	}
//	printf("\n");
//	//判断是什么原因结束的
//	if (ferror(fp))
//		puts("I/O error when reading");
//	else if (feof(fp))
//		puts("End of file reached successfully");
//	fclose(fp);
//}
//



//将data1.txt中的数据拷贝到data2.txt中

int main()
{
	FILE* pfRead = fopen("data1.txt", "r");
	if (pfRead == NULL)
	{
		ferror("open file for read");
		return 1;
	}
	FILE* pfWrite = fopen("data2.txt", "w");
	if (pfWrite == NULL)
	{
		ferror("open file for write");
		fclose(pfRead);
		pfRead = NULL;
		return 1;
	}
	//读写文件
	int ch = 0;
	
	while ((ch = fgetc(pfRead))!=EOF)
	{
		fputc(ch, pfWrite);
	}
	//关闭文件
	fclose(pfRead);
	pfRead = NULL;

	fclose(pfWrite);
	pfWrite = NULL;
	return 0;
}







